/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.espe.ccsoft.mantenimiento.dao;

import ec.edu.espe.ccsoft.mantenimiento.modelos.Acceso;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author misahaelfernandez
 */
@Stateless
public class AccesoFacade extends AbstractFacade<Acceso> {

    @PersistenceContext(unitName = "ec.edu.espe.ccsoft_CCSoftMantenimiento-ejb_ejb_1PU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public AccesoFacade() {
        super(Acceso.class);
    }
    
    public Acceso findByNombre(String nombre){
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a WHERE a.nombre=?1");
        consulta.setParameter(1, nombre);

        return consulta.getResultList().isEmpty() ? null : (Acceso) consulta.getSingleResult();
    }
    
    public List<Acceso> findRoots(){
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a WHERE a.menu IS NULL AND a.submenu IS NULL");
        
        return consulta.getResultList();
    }
    
    public List<Acceso> findMenuByRoot(Acceso menu){
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a WHERE a.menu=?1 AND a.submenu IS NULL");
        consulta.setParameter(1, menu);
        
        return consulta.getResultList();
    }
    
    public List<Acceso> findSubmenuByMenu(Acceso submenu){
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a WHERE a.submenu=?1");
        consulta.setParameter(1, submenu);
        
        return consulta.getResultList();
    }
    
    public List<Acceso> findMenuByCodigoRol(Integer codigoRol) {
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a, Rol r "
                + "INNER JOIN r.accesoList accesos "
                + "WHERE accesos.codAcceso = a.codAcceso AND a.menu IS NULL AND r.codRol=?1 "
                + "AND a.visible=true AND a.estado=true");
        consulta.setParameter(1, codigoRol);

        return consulta.getResultList();
    }

    public List<Acceso> findSubMenuByCodigoMenuRol(Integer codigoRol, Integer codigoMenu) {
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a, Rol r "
                + "INNER JOIN r.accesoList accesos "
                + "WHERE accesos.codAcceso=a.codAcceso AND a.menu IS NOT NULL AND a.submenu IS NULL "
                + "AND a.visible=true AND a.estado=true AND r.codRol=?1 AND a.menu.codAcceso=?2");

        consulta.setParameter(1, codigoRol);
        consulta.setParameter(2, codigoMenu);

        return consulta.getResultList();
    }

    public List<Acceso> findMenuItemCodigoSubMenuRol(Integer codigoRol, Integer codigoSubMenu) {
        Query consulta = this.em.createQuery("SELECT a FROM Acceso a, Rol r "
                + "INNER JOIN r.accesoList accesoRol "
                + "WHERE accesoRol.codAcceso=a.codAcceso AND a.menu IS NOT NULL AND a.submenu IS NOT NULL "
                + "AND a.visible=true AND a.estado=true AND r.codRol=?1 AND a.submenu.codAcceso=?2");

        consulta.setParameter(1, codigoRol);
        consulta.setParameter(2, codigoSubMenu);

        return consulta.getResultList();
    }
}
